package trolling;

import org.apache.torque.NoRowsException;
import org.apache.torque.TooManyRowsException;
import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;
import java.util.*;

import torque.generated.*;
import trolling.IO;
import trolling.Moteur;

/**
 * Classe principale
 *
 */
public class Menu {

	public final static String TORQUE_PROPS = new String(
			"torque-3.3//Torque.properties");

	/** Fonction principale. Créée un Menu.
	 * @param args Inutile.
	 */
	public static void main(String[] args) {
		try {
			/*
			 * Initializing Torque
			 */
			Torque.init(TORQUE_PROPS);
			/*
			 * // INSERTS Cine cineVox = new Cine(); cineVox.setNomcine("Vox");
			 * cineVox.setAdresse("15 Rue Thiers, 38000 Grenoble, France");
			 * cineVox.save();
			 * 
			 * /* Using the convenience methods to handle the foreign keys.
			 * 
			 * Salle salle1 = new Salle(); salle1.setNumsalle(1);
			 * salle1.setCapacite(200); salle1.setCine(cineVox); // The object
			 * is passed salle1.save();
			 */
			new Menu();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Fonction procédurale du programme demandant a l'utilisateur quelle fonction il compte utiliser. La plupart du temps, l'utilisateur ne choisira pas "Supprimer tout", mais ca peut arriver. Permet à l'utilisateur d'utiliser les fonctions de {@link Menu}
	 */
	public Menu() {
		try {
			int choix;

			do {
				IO.clear();
				System.out.println("MAXIMUM TROLLING");
				System.out.println("1. Créer partie");
				System.out.println("2. Charger une partie");
				System.out.println("3. Créer troll");
				System.out.println("4. Créer objet");
				System.out.println("5. Supprimer tout");
				System.out.println("0. Quitter");
				System.out.print("Choix : ");
				choix = IO.lireEntier();
				switch (choix) {
				case 1:
					this.creerPartie();
					break;
				case 2:
					this.chargerPartie();
					break;
				case 3:
					this.creerTroll();
					break;
				case 4:
					this.creerObjet();
					break;
				case 5:
					this.Supprimertout();
					break;
				}
			} while (choix != 0);
			Torque.closeConnection(Torque.getConnection());
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Propose a l'utilisateur de parametrer sa prochaine partie. Nous n'avons pas inclu de message d'avertissement quand aux dépendances qu'un tel jeu peut provoquer.
	 * Une fois la partie créée, celle ci est automatiquement lancée.
	 */
	public void creerPartie() {
		int largeur = 0;
		Vector<Troll> trolls = new Vector<Troll>();

		IO.clear();
		System.out.println("CREER PARTIE");
		Integer choix = 0;

		try {
			Criteria crit = new Criteria();
			crit.add(TrollPeer.VIE, 0, Criteria.GREATER_THAN);
			List<Troll> totaltrolls = TrollPeer.doSelect(crit);
			if (totaltrolls.isEmpty()) {
				System.out.println("Pas de trolls !");
				return;
			}
			while (largeur < 5 || largeur > 15) {
				System.out.print("Largeur plateau : ");
				largeur = IO.lireEntier();
			}
			int i = 0;
			do {
				do {
					Troll trolleph = totaltrolls.get(i);
					if (!trolls.contains(trolleph)) {
						IO.clear();
						System.out.println("Choisir le troll n°"
								+ (trolls.size() + 1));
						System.out.println(" :) " + trolleph.getNomtroll());
						System.out.println("   +A:" + trolleph.getAttaque());
						System.out.println("   +D:" + trolleph.getDegat());
						System.out.println("   +E:" + trolleph.getEsquive());
						System.out.println("   +V:" + trolleph.getVie());
						System.out.println("");
						System.out
								.println(" 1:Prec |2:Ajouter |3:Suiv |4:Lancer la partie");
						System.out.print("Choix : ");
						choix = IO.lireEntier();
					} else {
						choix = 3;
					}
					if (choix == 1) {
						i--;
						if (i < 0)
							i += totaltrolls.size();
					}
					if (choix == 3) {
						i++;
						if (i > totaltrolls.size() - 1)
							i -= totaltrolls.size();
					}
					if (choix == 2)
						trolls.add(trolleph);
				} while (choix == 1 || choix == 3);
				choix = 0;

				if (i != 0)
					i--;
			} while (choix == 4 || trolls.size() < totaltrolls.size());
			crit = new Criteria();
			List<Partie> ps = PartiePeer.doSelect(crit);
			int a = ps.size();
			System.out.println("Création de la partie n°" + a + "...");
			Partie partie = new Partie();
			partie.setIdpartie(a);
			partie.setLargeur(largeur);
			partie.save();
			for (Troll t : trolls) { // Ajouter les trolls
				partie.ajouterTroll(t);
			}
			crit = new Criteria();
			List<Objet> objs = ObjetPeer.doSelect(crit);
			partie.ajouterObjets(objs);
			Moteur jeu = new Moteur(partie);
		} catch (Exception e) {
			System.out.println("Erreur création partie");
			System.out.println(e.getMessage());
			e.printStackTrace();

		}

	}

	/** Affiche la liste des parties et lance la partie choisie a partir des données de la BdD
	 * 
	 */
	public void chargerPartie() {
		try {
			IO.clear();
			System.out.println("Liste des parties");
			int choix;
			List<Partie> ps = PartiePeer.doSelect(new Criteria());
			for (Partie p : ps) {
				System.out.print("	"+p.getIdpartie() + " - ");
				List<Trolldanspartie> ts = p.getTrolldansparties();
				for (Trolldanspartie t : ts) {
					if (ts.indexOf(t) != 0)
						System.out.print(" VS ");
					System.out.print(t.getNomtroll());
				}
				System.out.println();
			}
			System.out.print("Choix : ");
			choix = IO.lireEntier();
			if(choix>=0 && choix<ps.size()){
				Moteur jeu=new Moteur(ps.get(choix));
			}

		} catch (TorqueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	/**
	 * Propose a l'utilisateur de creer un troll. Il n'y a certes pas beaucoup de personnalisation possible, aussi nous lui avons fait une interface optimal pour un jeu console. Console Linux.
	 */
	public void creerTroll() {
		String nom;
		String type = "standard";
		List<Integer> carac = new ArrayList<Integer>();
		carac.add(0);
		carac.add(0);
		carac.add(0);
		carac.add(0);
		int pointsRestant = 40;
		int choix;
		int nb;
		IO.clear();
		System.out.println("CREER TROLL");
		System.out.print("Nom du troll : ");
		nom = IO.lireChaine();
		int ok;
		do {
			do {
				System.out.println();
				System.out.println();
				System.out.print("Points restant : ");
				System.out.println(pointsRestant);
				System.out.println(" = = = = = = ");
				System.out.print("	1 - Attaque  : ");
				System.out.println(carac.get(0));
				System.out.print("	2 - Degats : ");
				System.out.println(carac.get(1));
				System.out.print("	3 - Esquive : ");
				System.out.println(carac.get(2));
				System.out.print("	4 - Vie : ");
				System.out.println(carac.get(3));
				if (carac.get(3) == 0) {
					System.out.println("Attention ! Votre troll est mort !");
				}
				do {
					System.out.print("Caracteristique a changer : ");
					choix = IO.lireEntier();
					if ((choix < 1) || (choix > 4)) {
						System.out.println("Mauvais choix (1 2 3 ou 4");
					}
				} while ((choix < 1) || (choix > 4));
				choix--;
				do {
					System.out.print("Modifier pour : ");
					nb = IO.lireEntier();
					if ((pointsRestant + carac.get(choix) - nb) < 0) {
						System.out.print("Il vous manque ");
						System.out
								.print(-(pointsRestant + carac.get(choix) - nb));
						System.out.print(" point(s) !");
					}
				} while ((pointsRestant + carac.get(choix) - nb) < 0);
				pointsRestant = (pointsRestant + carac.get(choix) - nb);
				carac.set(choix, nb);
			} while (pointsRestant > 0);
			System.out.println();
			System.out.println();
			System.out.println("Vos caracteristiques  : ");
			System.out.print("	Attaque  : ");
			System.out.println(carac.get(0));
			System.out.print("	Degats : ");
			System.out.println(carac.get(1));
			System.out.print("	Esquive : ");
			System.out.println(carac.get(2));
			System.out.print("	Vie : ");
			System.out.println(carac.get(3));
			if (carac.get(3) == 0) {
				System.out
						.println("Attention ! Votre troll est mort ! Il ne pourra pas jouer de partie");
			}
			System.out.println("Êtes vous satisfaits ?");
			System.out.println("	1 - Oui");
			System.out.println("	2 - Non");

			System.out.print("Choix : ");
			ok = IO.lireEntier();
		} while (ok == 2);
		try {
			Troll troll = new Troll();
			troll.setNomtroll(nom);
			troll.setXp(0);
			troll.setType(type);
			troll.setAttaque(carac.get(0));
			troll.setDegat(carac.get(1));
			troll.setEsquive(carac.get(2));
			troll.setVie(carac.get(3));
			troll.save();
		} catch (Exception e) {
			System.out.println("Un troll porte déjà ce nom !");
			e.printStackTrace();
		}
	}

	/**
	 * Propose a l'utilisateur d'entrer un nouvel objet dans la Base de Données
	 */
	public void creerObjet() {
		String nomobjet = "";
		String description;
		int type = 0;
		int duree = 0;
		int bonusattaque;
		int bonusdegat;
		int bonusesquive;
		int bonusvie;
		int bonuspa;
		Vector<String> types = new Vector<String>();
		types.add("Arme");
		types.add("Casque");
		types.add("Armure");
		types.add("Potion");
		IO.clear();
		System.out.println("CREER OBJET");
		while (nomobjet.equals("") || nomobjet.length() > 20) {
			System.out.print("Nom : ");
			nomobjet = IO.lireChaine();
			if (nomobjet.length() > 20) {
				System.out.println("Nom trop long");
			}
		}
		while (!(type > 0 && type <= types.size())) {
			int n = 0;
			for (String t : types) {
				System.out.println("  " + ++n + " - " + t);
			}
			System.out.println("Type : ");
			type = IO.lireEntier();
		}
		type--;
		System.out.print("Description : ");
		description = IO.lireChaine();
		if (type == 3) {
			while (duree < 1) {
				System.out.print("Durée : ");
				duree = IO.lireEntier();
			}
		}
		System.out.print("Bonus attaque : ");
		bonusattaque = IO.lireEntier();
		System.out.print("Bonus dégats : ");
		bonusdegat = IO.lireEntier();
		System.out.print("Bonus esquive : ");
		bonusesquive = IO.lireEntier();
		System.out.print("Bonus vie : ");
		bonusvie = IO.lireEntier();
		System.out.print("Bonus points d'action : ");
		bonuspa = IO.lireEntier();

		try {
			Objet objet = new Objet();
			objet.setNomobjet(nomobjet);
			objet.setDescription(description);
			objet.setType(types.get(type));
			objet.setDuree(duree);
			objet.setBonusattaque(bonusattaque);
			objet.setBonusdegat(bonusdegat);
			objet.setBonusesquive(bonusesquive);
			objet.setBonusvie(bonusvie);
			objet.setBonuspa(bonuspa);
			objet.save();
		} catch (Exception e) {
			System.out.println("Un objet porte déjà ce nom !");
			e.printStackTrace();
		}
	}
	
	/**
	 * Supprime l'intégralité des contenus de la Base de Données. Utilisé durant le débuggage, il parut fort utile aux developpeurs de l'inclure dans la version finale
	 */
	public void Supprimertout(){
		try {
			List<Partie> ps = PartiePeer.doSelect(new Criteria());
			List<Troll> ts = TrollPeer.doSelect(new Criteria());
			List<Objet> os = ObjetPeer.doSelect(new Criteria());
			for(Partie p : ps)
				p.delete();
			for(Troll t : ts)
				TrollPeer.doDelete(t);
			for(Objet o : os)
				ObjetPeer.doDelete(o);
					
		} catch (TorqueException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
